package org.dicr.util.jds.report;

import java.util.*;

import javax.swing.event.*;

import org.dicr.event.*;
import org.dicr.util.jds.module.*;

/***********************************************************************************************************************
 * @author Igor A Tarasov me@dicr.dn.ua
 * @version 030115
 **********************************************************************************************************************/
public abstract class AbstractReport implements DataReport {
	private Collection<ChangeListener> listeners = new ArrayList<ChangeListener>();

	protected DicrDataModule datamodule = null;

	protected Collection<DataReportDocument> documents = new ArrayList<DataReportDocument>();

	protected List<String> errors = new ArrayList<String>();

	/*******************************************************************************************************************
	 * Обновляет документы
	 ******************************************************************************************************************/
	protected void updateDocuments() {
		this.documents.clear();
		this.errors.clear();
	}

	/*******************************************************************************************************************
	 * Установка модуля данных
	 ******************************************************************************************************************/
	@Override
    public void setDataModule(DicrDataModule theDataModule) {
		if (this.datamodule != theDataModule) {
			this.datamodule = theDataModule;
			try {
				updateDocuments();
			} catch (Exception ex) {
				DicrExceptionHandler.handleException(ex, this);
			}
			fireChangeEvent();
		}
	}

	/*******************************************************************************************************************
	 * Возвращает модуль данных
	 ******************************************************************************************************************/
	@Override
    public DicrDataModule getDataModule() {
		return this.datamodule;
	}

	/*******************************************************************************************************************
	 * Возвращает документы
	 ******************************************************************************************************************/
	@Override
    public Collection<DataReportDocument> getDocuments() {
		return this.documents;
	}

	/*******************************************************************************************************************
	 * Возвращает ошибки
	 ******************************************************************************************************************/
	@Override
    public List<String> getErrors() {
		return this.errors;
	}

	/*******************************************************************************************************************
	 * Добавляет слушателя изменений
	 ******************************************************************************************************************/
	@Override
    public void addChangeListener(ChangeListener l) {
		if (l != null && !this.listeners.contains(l)) this.listeners.remove(l);
	}

	/*******************************************************************************************************************
	 * Удалить слушателя событий
	 ******************************************************************************************************************/
	@Override
    public void removeChangeListener(ChangeListener l) {
		this.listeners.remove(l);
	}

	/*******************************************************************************************************************
	 * Оповещает слушателей
	 ******************************************************************************************************************/
	@Override
    public void fireChangeEvent() {
		for (ChangeListener listener : this.listeners) {
			try {
				listener.stateChanged(new ChangeEvent(this));
			} catch (Exception ex) {
				DicrExceptionHandler.handleException(ex, this);
			}
		}
	}
}
